Micron Document
🎖️GitЯра🎖️


Displaying Raw • Download

core/model/src/commonTest/kotlin/org/meshtastic/core/model/RegionInfoTest.kt b4bedd92fcc8d65daff79200d71f6ebc3d8f0cfa (b4bedd92) Text, 6.83 KB

T8b949e/*
* Copyright (c) 2026 Meshtastic LLC
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
Tff7b72package T7ee787org.meshtastic.core.model

Tff7b72import T7ee787org.meshtastic.proto.Config.LoRaConfig
Tff7b72import T7ee787org.meshtastic.proto.Config.LoRaConfig.ModemPreset
Tff7b72import T7ee787org.meshtastic.proto.Config.LoRaConfig.RegionCode
Tff7b72import T7ee787kotlin.test.Test
Tff7b72import T7ee787kotlin.test.assertEquals
Tff7b72import T7ee787kotlin.test.assertNotNull

T8b949e/**
* Frequency-slot expectations mirror the firmware's region table and slot math in
* `RadioInterface.cpp::applyModemConfig` (slot width = spacing + 2*padding + bandwidth; default slots from each
* region's RDEF entry).
*/
Tff7b72class T56d364RegionInfoTest Tb4b4b4{

Tff7b72private Tff7b72fun Td2a8ffloraTb4b4b4(Te6edf3regionTb4b4b4: Te6edf3RegionCodeTb4b4b4, Te6edf3presetTb4b4b4: Te6edf3ModemPresetTb4b4b4, Te6edf3channelNumTb4b4b4: Tffa657Int Tff7b72= T79c0ff0Tb4b4b4) Tff7b72=
Te6edf3LoRaConfigTb4b4b4(Te6edf3use_preset Tff7b72= Tff7b72trueTb4b4b4, Te6edf3modem_preset Tff7b72= Te6edf3presetTb4b4b4, Te6edf3region Tff7b72= Te6edf3regionTb4b4b4, Te6edf3channel_num Tff7b72= Te6edf3channelNumTb4b4b4)

T8b949e/**
* Every region the firmware's region table defines must be selectable in the app. The proto enum is a superset
* (e.g. EU_874, EU_917, UA_868 have no firmware entry), so parity is asserted against this explicit list.
*/
Tf0883e@Test
Tff7b72fun Td2a8ffensure_firmware_regions_are_mapped_in_RegionInfoTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3firmwareRegions Tff7b72=
Te6edf3listOfTb4b4b4(
Te6edf3RegionCodeTb4b4b4.Te6edf3USTb4b4b4,
Te6edf3RegionCodeTb4b4b4.Te6edf3EU_433Tb4b4b4,
Te6edf3RegionCodeTb4b4b4.Te6edf3EU_868Tb4b4b4,
Te6edf3RegionCodeTb4b4b4.Te6edf3EU_866Tb4b4b4,
Te6edf3RegionCodeTb4b4b4.Te6edf3EU_N_868Tb4b4b4,
Te6edf3RegionCodeTb4b4b4.Te6edf3CNTb4b4b4,
Te6edf3RegionCodeTb4b4b4.Te6edf3JPTb4b4b4,
Te6edf3RegionCodeTb4b4b4.Te6edf3ANZTb4b4b4,
Te6edf3RegionCodeTb4b4b4.Te6edf3ANZ_433Tb4b4b4,
Te6edf3RegionCodeTb4b4b4.Te6edf3RUTb4b4b4,
Te6edf3RegionCodeTb4b4b4.Te6edf3KRTb4b4b4,
Te6edf3RegionCodeTb4b4b4.Te6edf3TWTb4b4b4,
Te6edf3RegionCodeTb4b4b4.Te6edf3INTb4b4b4,
Te6edf3RegionCodeTb4b4b4.Te6edf3NZ_865Tb4b4b4,
Te6edf3RegionCodeTb4b4b4.Te6edf3THTb4b4b4,
Te6edf3RegionCodeTb4b4b4.Te6edf3UA_433Tb4b4b4,
Te6edf3RegionCodeTb4b4b4.Te6edf3MY_433Tb4b4b4,
Te6edf3RegionCodeTb4b4b4.Te6edf3MY_919Tb4b4b4,
Te6edf3RegionCodeTb4b4b4.Te6edf3SG_923Tb4b4b4,
Te6edf3RegionCodeTb4b4b4.Te6edf3PH_433Tb4b4b4,
Te6edf3RegionCodeTb4b4b4.Te6edf3PH_868Tb4b4b4,
Te6edf3RegionCodeTb4b4b4.Te6edf3PH_915Tb4b4b4,
Te6edf3RegionCodeTb4b4b4.Te6edf3KZ_433Tb4b4b4,
Te6edf3RegionCodeTb4b4b4.Te6edf3KZ_863Tb4b4b4,
Te6edf3RegionCodeTb4b4b4.Te6edf3NP_865Tb4b4b4,
Te6edf3RegionCodeTb4b4b4.Te6edf3BR_902Tb4b4b4,
Te6edf3RegionCodeTb4b4b4.Te6edf3ITU1_2MTb4b4b4,
Te6edf3RegionCodeTb4b4b4.Te6edf3ITU2_2MTb4b4b4,
Te6edf3RegionCodeTb4b4b4.Te6edf3ITU3_2MTb4b4b4,
Te6edf3RegionCodeTb4b4b4.Te6edf3ITU2_125CMTb4b4b4,
Te6edf3RegionCodeTb4b4b4.Te6edf3ITU1_70CMTb4b4b4,
Te6edf3RegionCodeTb4b4b4.Te6edf3ITU2_70CMTb4b4b4,
Te6edf3RegionCodeTb4b4b4.Te6edf3ITU3_70CMTb4b4b4,
Te6edf3RegionCodeTb4b4b4.Te6edf3LORA_24Tb4b4b4,
Te6edf3RegionCodeTb4b4b4.Te6edf3UNSETTb4b4b4,
Tb4b4b4)
Te6edf3firmwareRegionsTb4b4b4.Te6edf3forEach Tb4b4b4{ Te6edf3region Tff7b72-Tff7b72>
Te6edf3assertNotNullTb4b4b4(
Te6edf3RegionInfoTb4b4b4.Te6edf3fromRegionCodeTb4b4b4(Te6edf3regionTb4b4b4)Tb4b4b4,
Ta5d6ff"Ta5d6ffMissing RegionInfo entry for firmware region 'Tffd700${Te6edf3regionTb4b4b4.Te6edf3nameTffd700}Ta5d6ff'.Ta5d6ff"Tb4b4b4,
Tb4b4b4)
Tb4b4b4}
Tb4b4b4}

Tf0883e@Test
Tff7b72fun Td2a8ffham_2m_regions_use_20kHz_slotsTb4b4b4(Tb4b4b4) Tb4b4b4{
T8b949e// ITU1_2M: 144-146 MHz, TINY_FAST (15.625 kHz) padded to 20.025 kHz slots -> 100 slots, default slot 26.
Tff7b72val Te6edf3itu1 Tff7b72= Te6edf3loraTb4b4b4(Te6edf3RegionCodeTb4b4b4.Te6edf3ITU1_2MTb4b4b4, Te6edf3ModemPresetTb4b4b4.Te6edf3TINY_FASTTb4b4b4)
Te6edf3assertEqualsTb4b4b4(T79c0ff1T79c0ff0T79c0ff0Tb4b4b4, Te6edf3itu1Tb4b4b4.Te6edf3numChannelsTb4b4b4)
Te6edf3assertEqualsTb4b4b4(T79c0ff2T79c0ff6Tb4b4b4, Te6edf3itu1Tb4b4b4.Te6edf3channelNumTb4b4b4(Ta5d6ff"Ta5d6ffTinyFastTa5d6ff"Tb4b4b4)Tb4b4b4)
Te6edf3assertEqualsTb4b4b4(T79c0ff1T79c0ff4T79c0ff4.5106fTb4b4b4, Te6edf3itu1Tb4b4b4.Te6edf3radioFreqTb4b4b4(T79c0ff2T79c0ff6Tb4b4b4)Tb4b4b4, T79c0ff0.001fTb4b4b4)

T8b949e// ITU2_2M: 144-148 MHz -> 200 slots, default slot 51 (145.010 MHz).
Tff7b72val Te6edf3itu2 Tff7b72= Te6edf3loraTb4b4b4(Te6edf3RegionCodeTb4b4b4.Te6edf3ITU2_2MTb4b4b4, Te6edf3ModemPresetTb4b4b4.Te6edf3TINY_FASTTb4b4b4)
Te6edf3assertEqualsTb4b4b4(T79c0ff2T79c0ff0T79c0ff0Tb4b4b4, Te6edf3itu2Tb4b4b4.Te6edf3numChannelsTb4b4b4)
Te6edf3assertEqualsTb4b4b4(T79c0ff1T79c0ff4T79c0ff5.011fTb4b4b4, Te6edf3itu2Tb4b4b4.Te6edf3radioFreqTb4b4b4(Te6edf3itu2Tb4b4b4.Te6edf3channelNumTb4b4b4(Ta5d6ff"Ta5d6ffTinyFastTa5d6ff"Tb4b4b4)Tb4b4b4)Tb4b4b4, T79c0ff0.001fTb4b4b4)

T8b949e// ITU3_2M: 144-148 MHz -> 200 slots, default slot 33 (144.650 MHz).
Tff7b72val Te6edf3itu3 Tff7b72= Te6edf3loraTb4b4b4(Te6edf3RegionCodeTb4b4b4.Te6edf3ITU3_2MTb4b4b4, Te6edf3ModemPresetTb4b4b4.Te6edf3TINY_FASTTb4b4b4)
Te6edf3assertEqualsTb4b4b4(T79c0ff2T79c0ff0T79c0ff0Tb4b4b4, Te6edf3itu3Tb4b4b4.Te6edf3numChannelsTb4b4b4)
Te6edf3assertEqualsTb4b4b4(T79c0ff1T79c0ff4T79c0ff4.6508fTb4b4b4, Te6edf3itu3Tb4b4b4.Te6edf3radioFreqTb4b4b4(Te6edf3itu3Tb4b4b4.Te6edf3channelNumTb4b4b4(Ta5d6ff"Ta5d6ffTinyFastTa5d6ff"Tb4b4b4)Tb4b4b4)Tb4b4b4, T79c0ff0.001fTb4b4b4)
Tb4b4b4}

Tf0883e@Test
Tff7b72fun Td2a8ffham_70cm_and_125cm_regions_use_100kHz_slotsTb4b4b4(Tb4b4b4) Tb4b4b4{
T8b949e// ITU2_70CM: 420-450 MHz, NARROW_SLOW (62.5 kHz) padded to 100 kHz slots -> 300 slots,
T8b949e// default slot 137 (433.650 MHz).
Tff7b72val Te6edf3itu270cm Tff7b72= Te6edf3loraTb4b4b4(Te6edf3RegionCodeTb4b4b4.Te6edf3ITU2_70CMTb4b4b4, Te6edf3ModemPresetTb4b4b4.Te6edf3NARROW_SLOWTb4b4b4)
Te6edf3assertEqualsTb4b4b4(T79c0ff3T79c0ff0T79c0ff0Tb4b4b4, Te6edf3itu270cmTb4b4b4.Te6edf3numChannelsTb4b4b4)
Te6edf3assertEqualsTb4b4b4(T79c0ff1T79c0ff3T79c0ff7Tb4b4b4, Te6edf3itu270cmTb4b4b4.Te6edf3channelNumTb4b4b4(Ta5d6ff"Ta5d6ffNarrowSlowTa5d6ff"Tb4b4b4)Tb4b4b4)
Te6edf3assertEqualsTb4b4b4(T79c0ff4T79c0ff3T79c0ff3.65fTb4b4b4, Te6edf3itu270cmTb4b4b4.Te6edf3radioFreqTb4b4b4(T79c0ff1T79c0ff3T79c0ff7Tb4b4b4)Tb4b4b4, T79c0ff0.001fTb4b4b4)

T8b949e// ITU1_70CM: 430-440 MHz -> 100 slots, default slot 37 (433.650 MHz).
Tff7b72val Te6edf3itu170cm Tff7b72= Te6edf3loraTb4b4b4(Te6edf3RegionCodeTb4b4b4.Te6edf3ITU1_70CMTb4b4b4, Te6edf3ModemPresetTb4b4b4.Te6edf3NARROW_SLOWTb4b4b4)
Te6edf3assertEqualsTb4b4b4(T79c0ff1T79c0ff0T79c0ff0Tb4b4b4, Te6edf3itu170cmTb4b4b4.Te6edf3numChannelsTb4b4b4)
Te6edf3assertEqualsTb4b4b4(T79c0ff4T79c0ff3T79c0ff3.65fTb4b4b4, Te6edf3itu170cmTb4b4b4.Te6edf3radioFreqTb4b4b4(Te6edf3itu170cmTb4b4b4.Te6edf3channelNumTb4b4b4(Ta5d6ff"Ta5d6ffNarrowSlowTa5d6ff"Tb4b4b4)Tb4b4b4)Tb4b4b4, T79c0ff0.001fTb4b4b4)

T8b949e// ITU3_70CM: 430-450 MHz -> 200 slots, default slot 37 (433.650 MHz).
Tff7b72val Te6edf3itu370cm Tff7b72= Te6edf3loraTb4b4b4(Te6edf3RegionCodeTb4b4b4.Te6edf3ITU3_70CMTb4b4b4, Te6edf3ModemPresetTb4b4b4.Te6edf3NARROW_SLOWTb4b4b4)
Te6edf3assertEqualsTb4b4b4(T79c0ff2T79c0ff0T79c0ff0Tb4b4b4, Te6edf3itu370cmTb4b4b4.Te6edf3numChannelsTb4b4b4)
Te6edf3assertEqualsTb4b4b4(T79c0ff4T79c0ff3T79c0ff3.65fTb4b4b4, Te6edf3itu370cmTb4b4b4.Te6edf3radioFreqTb4b4b4(Te6edf3itu370cmTb4b4b4.Te6edf3channelNumTb4b4b4(Ta5d6ff"Ta5d6ffNarrowSlowTa5d6ff"Tb4b4b4)Tb4b4b4)Tb4b4b4, T79c0ff0.001fTb4b4b4)

T8b949e// ITU2_125CM: 220-225 MHz -> 50 slots, default slot 37 (223.650 MHz).
Tff7b72val Te6edf3itu2125cm Tff7b72= Te6edf3loraTb4b4b4(Te6edf3RegionCodeTb4b4b4.Te6edf3ITU2_125CMTb4b4b4, Te6edf3ModemPresetTb4b4b4.Te6edf3NARROW_SLOWTb4b4b4)
Te6edf3assertEqualsTb4b4b4(T79c0ff5T79c0ff0Tb4b4b4, Te6edf3itu2125cmTb4b4b4.Te6edf3numChannelsTb4b4b4)
Te6edf3assertEqualsTb4b4b4(T79c0ff2T79c0ff2T79c0ff3.65fTb4b4b4, Te6edf3itu2125cmTb4b4b4.Te6edf3radioFreqTb4b4b4(Te6edf3itu2125cmTb4b4b4.Te6edf3channelNumTb4b4b4(Ta5d6ff"Ta5d6ffNarrowSlowTa5d6ff"Tb4b4b4)Tb4b4b4)Tb4b4b4, T79c0ff0.001fTb4b4b4)
Tb4b4b4}

Tf0883e@Test
Tff7b72fun Td2a8ffeu_866_lite_gives_four_600kHz_slotsTb4b4b4(Tb4b4b4) Tb4b4b4{
T8b949e// EU_866: 865.6-867.6 MHz, LITE_FAST (125 kHz) with 400 kHz spacing + 37.5 kHz padding
T8b949e// -> 4 slots at 865.7/866.3/866.9/867.5 MHz.
Tff7b72val Te6edf3eu866 Tff7b72= Te6edf3loraTb4b4b4(Te6edf3RegionCodeTb4b4b4.Te6edf3EU_866Tb4b4b4, Te6edf3ModemPresetTb4b4b4.Te6edf3LITE_FASTTb4b4b4)
Te6edf3assertEqualsTb4b4b4(T79c0ff4Tb4b4b4, Te6edf3eu866Tb4b4b4.Te6edf3numChannelsTb4b4b4)
Te6edf3assertEqualsTb4b4b4(T79c0ff8T79c0ff6T79c0ff5.7fTb4b4b4, Te6edf3eu866Tb4b4b4.Te6edf3radioFreqTb4b4b4(T79c0ff1Tb4b4b4)Tb4b4b4, T79c0ff0.001fTb4b4b4)
Te6edf3assertEqualsTb4b4b4(T79c0ff8T79c0ff6T79c0ff7.5fTb4b4b4, Te6edf3eu866Tb4b4b4.Te6edf3radioFreqTb4b4b4(T79c0ff4Tb4b4b4)Tb4b4b4, T79c0ff0.001fTb4b4b4)
Tb4b4b4}

Tf0883e@Test
Tff7b72fun Td2a8ffeu_n_868_narrow_defaults_to_first_slotTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3euN868 Tff7b72= Te6edf3loraTb4b4b4(Te6edf3RegionCodeTb4b4b4.Te6edf3EU_N_868Tb4b4b4, Te6edf3ModemPresetTb4b4b4.Te6edf3NARROW_SLOWTb4b4b4)
Te6edf3assertEqualsTb4b4b4(T79c0ff3Tb4b4b4, Te6edf3euN868Tb4b4b4.Te6edf3numChannelsTb4b4b4)
Te6edf3assertEqualsTb4b4b4(T79c0ff1Tb4b4b4, Te6edf3euN868Tb4b4b4.Te6edf3channelNumTb4b4b4(Ta5d6ff"Ta5d6ffNarrowSlowTa5d6ff"Tb4b4b4)Tb4b4b4)
Te6edf3assertEqualsTb4b4b4(T79c0ff8T79c0ff6T79c0ff9.4417fTb4b4b4, Te6edf3euN868Tb4b4b4.Te6edf3radioFreqTb4b4b4(T79c0ff1Tb4b4b4)Tb4b4b4, T79c0ff0.001fTb4b4b4)
Tb4b4b4}

Tf0883e@Test
Tff7b72fun Td2a8ffstandard_regions_keep_legacy_slot_mathTb4b4b4(Tb4b4b4) Tb4b4b4{
T8b949e// US: 902-928 MHz, LONG_FAST (250 kHz), no spacing/padding/override -> 104 hash-addressed slots.
Tff7b72val Te6edf3us Tff7b72= Te6edf3loraTb4b4b4(Te6edf3RegionCodeTb4b4b4.Te6edf3USTb4b4b4, Te6edf3ModemPresetTb4b4b4.Te6edf3LONG_FASTTb4b4b4)
Te6edf3assertEqualsTb4b4b4(T79c0ff1T79c0ff0T79c0ff4Tb4b4b4, Te6edf3usTb4b4b4.Te6edf3numChannelsTb4b4b4)
Te6edf3assertEqualsTb4b4b4(T79c0ff9T79c0ff0T79c0ff6.875fTb4b4b4, Te6edf3usTb4b4b4.Te6edf3radioFreqTb4b4b4(T79c0ff2T79c0ff0Tb4b4b4)Tb4b4b4, T79c0ff0.001fTb4b4b4)
Tb4b4b4}

Tf0883e@Test
Tff7b72fun Td2a8ffexplicit_channel_num_wins_over_override_slotTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3itu1 Tff7b72= Te6edf3loraTb4b4b4(Te6edf3RegionCodeTb4b4b4.Te6edf3ITU1_2MTb4b4b4, Te6edf3ModemPresetTb4b4b4.Te6edf3TINY_FASTTb4b4b4, Te6edf3channelNum Tff7b72= T79c0ff5Tb4b4b4)
Te6edf3assertEqualsTb4b4b4(T79c0ff5Tb4b4b4, Te6edf3itu1Tb4b4b4.Te6edf3channelNumTb4b4b4(Ta5d6ff"Ta5d6ffTinyFastTa5d6ff"Tb4b4b4)Tb4b4b4)
Tb4b4b4}
Tb4b4b4}

Served by rngit 1.5.0 - Generated in 0.08s